1.1-JS基础知识
Create by fall on — — 2020 Recently revised in 21 Nov 2024
发展史
1995 年 JavaScript
诞生。
ES6 其实是泛指,2015 年六月发布 ES6 第一个版本,然后规定,每年的六月发布一次正式版本,版本号以当年年份为准 ES6。
一般来讲,新增的 JavaScript 的语法通常要经历以下五个阶段
阶段 | 英文名 | 含义 |
---|---|---|
Stage 0 | Strawperson | 展示阶段 |
Stage 1 | Proposal | 征求意见阶段 |
Stage 2 | Draft | 草案阶段 |
Stage 3 | Candidate | 候选阶段 |
Stage 4 | Finished | 定案阶段 |
ES6 改进了前端编程体验,带来更多方便使用的特性,并且适用范围最广,所以本笔记也以 ES6 的内容为基础进行编写。
JavaScript 标准委员会 TC39 提出的实验性功能。在浏览器中的支持是有限的,但是可以通过 Babel 添加语法解析或提供 API 使用此功能。
变量
变量声明
可以声明三种变量类型
普通变量:var
var
声明的作用域是函数作用域,在整个函数内都有效- 可以被声明多次
局部变量:let
,只在块级作用域内生效
- 只要遇到大括号都会形成作用域,只在该大括号内可以使用该变量。
- 只能被声明一次
声明常量:const
- 用
const
声明的变量,只能在声明的时候确定值(或者是指针),后续没有办法修改 - 常量的作用域和
let
相同,也是只能声明一次
为什么要引入 let 和 const
- let、const 声明的变量不会被提升。在 javascript 引擎编译后,会保存在词法环境中
- 块级作用域在代码执行时,将 let、const 变量存放在词法环境的一个单独的区域。词法环境内部维护一个小型的栈结构,作用域内部变量压入栈顶。作用域执行完,从栈顶弹出
var foo = ""
let foo1 = ""
const foo2 = ""
块级作用域有例外,比如
let
在for
循环的小括号中使用时,虽然在小括号内,但作用域会被提取到每个大括号中的内容。为了方便编写代码。
for
小括号中使用var
变量是可以在循环之后进行访问的,如果在循环中使用的是let
,在循环后无法使用。
let
不能在变量声明之前访问该变量,var
可以访问并且不会报错,但值为undefined
const
声明对象或者数组时,只是不能更改指向,可以添加,或者删除对象上的属性。
变量类型
在 JS 中,只需声明变量,由引擎判断所属类型,目前为止共有九个类型
- Data Types(六个数据类型) :undefined、Boolean、Number、String、BigInt、Symbol
- Structural Types (两个构造类型):Object、Function、
- Structural Root (一个原始数据类型):null
注意:没有 Array 数据类型,本质上 Array 是继承 Object,在此基础上,浏览器会做一些优化,所以
typeof arr
类型为'object'
。
注释
三种类型的注释:
// 区间注释,在区域内部,都是注释
const find1 /* 一些内容 */ = 99
const find2 = 99 /* 一些
内容 */
// 行尾注释
console.log(find1) // 输出 find1
js doc
方法注释,方法注释会帮助编辑器(VS Code)进行提示
/**
* 从对象中移除属性
* @param {number} a 加数
* @param {number} b 加数
* @return {number} sum 和
*/
function sum(a,b){
return a+b
}
/**
* @deprecated use {@link sum} instead
*/
function abandoned(a,b){
return a+b
}
严格模式
严格模式是对语法进行额外限制,使代码更明确。
use strict
是一种运行时自动执行更严格的 JavaScript
代码解析和错误处理的方法。如果代码错误被忽略或失败,将会产生错误或抛出异常。
非严格模式下
a = 100
console.log(a) // 100
严格模式下
"use strict"
a = 100
console.log(a) // 我直接给你报错!Error!
ES6 的模块自动采用严格模式,不管你有没有在模块头部加上 "use strict"
严格模式主要有以下限制:
- 变量必须声明后再使用
- 函数的参数不能有同名属性,否则报错
- 不能使用 with 语句
- 不能对只读属性赋值,否则报错
- 不能使用前缀 0 表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错
- 不能删除变量delete prop ,会报错,只能删除属性 selete global[prop]
- eval 不会在它的外层作用域引入变量
- eval和arguments不能被重新赋值
- arguments不会自动反映函数参数的变化
- 不能使用arguments.callee
- 不能使用arguments.caller
- 禁止this指向全局对象,此 this 指向 undefined,能避免在顶层使用 this,和顶层使用 this 报错。
- 不能使用fn.caller和fn.arguments获取函数调用的堆栈
- 增加了保留字(比如protected、static和interface)
严格模式是ES5引入的,上面这些限制,模块都必须遵守。
严格模式的好处:
-
使调试跟更容易。如果代码错误本来会被忽略或失败,那么现在将会产生错误或抛出异常,从而更快地发现代码中的问题,并更快地指引它们的源代码。
-
防止意外全局。如果没有严格模式,将指赋值给未声明的变量会自动创建一个具有该名称的全局变量。这是JavaScript中最常见的错误之一。在严格模式下,会直接报错。
-
消除隐藏威胁。在没有严格模式的情况下,对null或undefined的这个值得引用会自动强制到全局。这可能会导致需要headfakes和pull-out-your-hair类型的错误。在严格模式下,因公用null或undefined的这个值会引发错误。
-
不允许重复的参数值。严格模式在检测到函数的重复命名参数(例如,函数foo(var1,var2,var1))时会引发错误,从而捕获代码中几乎可以肯定存在的错误,否则会浪费大量的时间追踪命名上的问题。
注意:它曾经是(ECMAScript 5 中)strict模式将禁止重复的属性名称(例如:
var object = {foo:“bar”,foo:“baz”}
;)但是从ECMAScript 2015 开始,就不再有这种情况了。 -
使
eval()
更安全。eval()
在严格模式和非严格模式下的行为方式有些不同。最重要的是,在严格模式下,在eval()
语句内部声明的变量和函数不会再包含范围中创建(它们是以非严格模式在包含范围中创建的,这也可能是问的常见来源)。 -
抛出无效的使用错误的删除符。删除操作符(用于从对象中删除属性)不能用于对象的不可配置属性,当试图删除一个不可配置的属性时,非严格代码将自动失败,而在这种情况下,严格模式会引发错误
参考文章:
文章标题 | 地址 |
---|---|
"use strict" 的意义和好处 | https://blog.csdn.net/qq_36379070/article/details/82586892 |